#ifndef BLOCKINGQUEUE_H
#define BLOCKINGQUEUE_H

#include <QQueue>
#include <QMutex>
#include <QWaitCondition>
#include <QDebug>

template<typename T>
class BlockingQueue
{
public:
    explicit BlockingQueue()
    {
    }
    void enqueue(const T &value)
    {
        QMutexLocker locker(&mutex);
        queue.enqueue(value);
        waitCond.wakeOne(); // 唤醒一个等待中的线程
    }

    T dequeue()
    {
        QMutexLocker locker(&mutex);
        while (queue.isEmpty())
            waitCond.wait(&mutex); // 如果队列为空，则等待
        return queue.dequeue();
    }

private:
    QQueue<T> queue;
    mutable QMutex mutex;
    QWaitCondition waitCond;
};

template<typename T>
class BoundedBlockingQueue
{
public:
    explicit BoundedBlockingQueue(int capacity)
        : maxCapacity(capacity)
        , currentSize(0)
    {
    }

    void enqueue(const T &value)
    {
        QMutexLocker locker(&mutex);
        while (currentSize >= maxCapacity) { // 队列已满则等待
            qDebug() << "Queue is full, waiting...";
            notFull.wait(&mutex);
        }
        queue.enqueue(value);
        ++currentSize;
        // 通知可能正在等待的dequeue操作
        notEmpty.wakeOne();
    }

    T dequeue()
    {
        QMutexLocker locker(&mutex);
        while (queue.isEmpty()) { // 如果队列为空，则等待
            qDebug() << "Queue is empty, waiting...";
            notEmpty.wait(&mutex);
        }
        T value = queue.dequeue();
        --currentSize;
        // 通知可能正在等待的enqueue操作
        notFull.wakeOne();
        return value;
    }

private:
    QQueue<T> queue;
    mutable QMutex mutex;
    QWaitCondition notEmpty; // 用于当队列为空时阻塞dequeue调用
    QWaitCondition notFull; // 用于当队列满时阻塞enqueue调用
    const int maxCapacity; // 队列的最大容量
    int currentSize; // 当前队列中的元素数量
};

#endif // BLOCKINGQUEUE_H
